﻿using System.Linq;
using System.Reflection;

namespace Vk.Methods.Users
{
    /// <summary>
    ///     Поля
    /// </summary>
    public static class UserFields
    {
        /// <summary>
        ///     Все поля
        /// </summary>
        public static string[] GetAllFields()
        {
            var fields = typeof(UserFields).GetFields(BindingFlags.Static | BindingFlags.NonPublic);
            return fields.Where(x => x.FieldType == typeof(string)).Select(x => (string) x.GetValue(null)).ToArray();
        }

        /// <summary>
        ///     Пол пользователя
        /// </summary>
        public const string Sex = "sex";

        /// <summary>
        ///     Дата рождения. Возвращается в формате DD.MM.YYYY или DD.MM (если год рождения скрыт). Если дата рождения скрыта
        ///     целиком, поле отсутствует в ответе.
        /// </summary>
        public const string BirthDate = "bdate";

        /// <summary>
        ///     Идентификатор города, указанного на странице пользователя в разделе «Контакты».
        /// </summary>
        public const string City = "city";

        /// <summary>
        ///     Идентификатор страны, указанной на странице пользователя в разделе «Контакты».
        /// </summary>
        public const string Country = "country";

        /// <summary>
        ///     Возвращается true, если страница пользователя верифицирована, false — если не верифицирована.
        /// </summary>
        public const string Verified = "verified";

        /// <summary>
        ///     url квадратной фотографии пользователя, имеющей ширину 50 пикселей. В случае отсутствия у пользователя фотографии
        ///     возвращается http://vk.com/images/camera_c.gif.
        /// </summary>
        public const string Photo50 = "photo_50";

        /// <summary>
        ///     url квадратной фотографии пользователя, имеющей ширину 100 пикселей. В случае отсутствия у пользователя фотографии
        ///     возвращается http://vk.com/images/camera_b.gif.
        /// </summary>
        public const string Photo100 = "photo_100";

        /// <summary>
        ///     url квадратной фотографии пользователя, имеющей ширину 200 пикселей. В случае отсутствия у пользователя фотографии
        ///     возвращается http://vk.com/images/camera_a.gif.
        /// </summary>
        public const string Photo200 = "photo_200";

        /// <summary>
        ///     url фотографии пользователя, имеющей ширину 200 пикселей. В случае отсутствия у пользователя фотографии
        ///     возвращается http://vk.com/images/camera_a.gif.
        /// </summary>
        public const string Photo200Orig = "photo_200_orig";

        /// <summary>
        ///     url фотографии пользователя, имеющей ширину 400 пикселей. Если у пользователя отсутствует фотография такого
        ///     размера, ответ не будет содержать этого поля.
        /// </summary>
        public const string Photo400Orig = "photo_400_orig";

        /// <summary>
        ///     url квадратной фотографии пользователя с максимальной шириной. Может быть возвращена фотография, имеющая ширину как
        ///     200, так и 100 пикселей. В случае отсутствия у пользователя фотографии возвращается
        ///     http://vk.com/images/camera_b.gif.
        /// </summary>
        public const string PhotoMax = "photo_max";

        /// <summary>
        ///     url фотографии пользователя максимального размера. Может быть возвращена фотография, имеющая ширину как 400, так и
        ///     200 пикселей. В случае отсутствия у пользователя фотографии возвращается http://vk.com/images/camera_a.gif.
        /// </summary>
        public const string PhotoMaxOrig = "photo_max_orig";

        /// <summary>
        ///     Информация о том, находится ли пользователь сейчас на сайте.
        ///     Возвращаемые значения: 1 — находится, 0 — не находится.
        ///     Если пользователь использует мобильное приложение либо мобильную версию сайта,
        ///     возвращается дополнительное поле online_mobile, содержащее 1.
        ///     При этом, если используется именно приложение, дополнительно возвращается поле online_app, содержащее его
        ///     идентификатор.
        /// </summary>
        public const string Online = "online";

        /// <summary>
        ///     Доступно ли комментирование стены
        /// </summary>
        public const string WallComments = "wall_coments";

        /// <summary>
        ///     Разделенные запятой идентификаторы списков друзей, в которых состоит пользователь. Поле доступно только для метода
        ///     friends.get. Получить информацию об id и названиях списков друзей можно с помощью метода friends.getLists. Если
        ///     пользователь не состоит ни в одном списке друзей, данное поле отсутствует в ответе.
        /// </summary>
        public const string Lists = "lists";

        /// <summary>
        ///     Короткий адрес страницы. Возвращается строка, содержащая короткий адрес страницы (возвращается только сам поддомен,
        ///     например, andrew). Если он не назначен, возвращается "id"+userId, например, id35828305.
        /// </summary>
        public const string Domain = "domain";

        /// <summary>
        ///     Информация о том, известен ли номер мобильного телефона пользователя. Возвращаемые значения: 1 — известен, 0 — не
        ///     известен. Рекомендуется использовать перед вызовом метода secure.sendSMSNotification.
        /// </summary>
        public const string HasMobile = "has_mobile";

        /// <summary>
        ///     Информация о телефонных номерах пользователя.
        ///     Если данные указаны и не скрыты настройками приватности, возвращаются следующие поля:
        ///     mobile_phone — номер мобильного телефона пользователя;
        ///     home_phone — номер домашнего телефона пользователя.
        /// </summary>
        public const string Contacts = "contacts";

        /// <summary>
        /// Данные о точках, по которым вырезаны профильная и миниатюрная фотографии пользователя.
        /// </summary>
        public const string CropPhoto = "crop_photo";

        /// <summary>
        ///     Возвращает данные о подключенных сервисах пользователя, таких как: skype, facebook, twitter, livejournal,
        ///     instagram.
        /// </summary>
        public const string Connections = "connections";

        /// <summary>
        ///     Возвращает указанный в профиле сайт пользователя.
        /// </summary>
        public const string Site = "site";

        /// <summary>
        ///     Информация о высшем учебном заведении пользователя
        /// </summary>
        public const string Education = "education";

        /// <summary>
        ///     Список высших учебных заведений, в которых учился текущий пользователь.
        /// </summary>
        public const string Universities = "universities";

        /// <summary>
        ///     Список школ, в которых учился пользователь
        /// </summary>
        public const string Schools = "schools";

        /// <summary>
        ///     Информация о том, разрешено ли оставлять записи на стене у пользователя.
        /// </summary>
        public const string CanPost = "can_post";

        /// <summary>
        ///     Информация о том, разрешено ли видеть чужие записи на стене пользователя.
        /// </summary>
        public const string CanSeeAllPosts = "can_see_all_posts";

        /// <summary>
        ///     Информация о том, разрешено ли видеть чужие аудиозаписи на стене пользователя
        /// </summary>
        public const string CanSeeAudio = "can_see_audio";

        /// <summary>
        ///     Информация о том, разрешено ли написание личных сообщений данному пользователю.
        /// </summary>
        public const string CanWritePrivateMessage = "can_write_private_message";

        /// <summary>
        ///     Статус пользователя. Возвращается строка, содержащая текст статуса, расположенного в профиле под именем
        ///     пользователя. Если у пользователя включена опция «Транслировать в статус играющую музыку», будет возвращено
        ///     дополнительное поле status_audio, содержащее информацию о транслируемой композиции.
        /// </summary>
        public const string Status = "status";

        /// <summary>
        ///     время последнего посещения. Возвращается объект last_seen со следующими полями:
        ///     time - время последнего посещения в формате unixtime.
        ///     platform - тип платформы, через которую был осуществлён последний вход.
        /// </summary>
        public const string LastSeen = "last_seen";

        /// <summary>
        ///     Количество общих друзей с текущим пользователем.
        /// </summary>
        public const string CommonCount = "common_count";

        /// <summary>
        ///     Количество подписчиков пользователя
        /// </summary>
        public const string FollowersCount = "followers_count";

        /// <summary>
        ///     Семейное положение пользователя
        /// </summary>
        public const string Relation = "relation";

        /// <summary>
        ///     Список родственников текущего пользователя Возвращает список обхектов cодержащих поля id, type. (и name в случаях,
        ///     когда родственник не является пользователем ВКонтакте).
        /// </summary>
        public const string Relatives = "relatives";

        /// <summary>
        ///     Количество различных объектов у пользователя. Может быть использовано только в методе users.get при запросе
        ///     информации об одном пользователе, с передачей access_token.
        /// </summary>
        public const string Counters = "counters";

        /// <summary>
        ///     Возвращается true, если текущий пользователь находится в черном списке у запрашиваемого.
        /// </summary>
        public const string Blacklisted = "blacklisted";

        /// <summary>
        ///     Возвращается true, если пользователь находится в черном списке у текущего пользователя. 
        /// </summary>
        public const string BlacklistedByMe = "blacklisted_by_me";

        /// <summary>
        ///     Временная зона пользователя. Возвращается только при запросе информации о текущем пользователе.
        /// </summary>
        public const string Timezone = "timezone";

        /// <summary>
        ///     Информация о полях из раздела «Жизненная позиция»
        /// </summary>
        public const string Personal = "personal";

        /// <summary>
        ///     Деятельность.
        /// </summary>
        public const string Activities = "activities";

        /// <summary>
        ///     Интересы.
        /// </summary>
        public const string Interests = "interests";

        /// <summary>
        ///     Любимая музыка.
        /// </summary>
        public const string Music = "music";

        /// <summary>
        ///     Любимые фильмы.
        /// </summary>
        public const string Movies = "movies";

        /// <summary>
        ///     Любимые шоу.
        /// </summary>
        public const string TV = "tv";

        /// <summary>
        ///     Любимые книги.
        /// </summary>
        public const string Books = "books";

        /// <summary>
        ///     Любимые игры.
        /// </summary>
        public const string Games = "games";

        /// <summary>
        ///     "О себе".
        /// </summary>
        public const string About = "about";

        /// <summary>
        ///     Любимые цитаты.
        /// </summary>
        public const string Quotes = "quotes";

        /// <summary>
        ///     Название родного города пользователя.
        /// </summary>
        public const string Hometown = "home_town";

        /// <summary>
        ///     Информация о текущем роде занятия пользователя.
        /// </summary>
        public const string Occupation = "occupation";

        /// <summary>
        ///     Никнейм (отчество) пользователя.
        /// </summary>
        public const string Nickname = "nickname";

        /// <summary>
        ///     Короткое имя (поддомен) страницы пользователя.
        /// </summary>
        public const string ScreenName = "screen_name";

        /// <summary>
        /// Информация о том, будет ли отправлено уведомление пользователю о заявке в друзья от текущего пользователя
        /// </summary>
        public const string CanSendFriendRequest = "can_send_friend_request";

        /// <summary>
        /// Информация о карьере пользователя.
        /// </summary>
        public const string Career = "career";

        /// <summary>
        /// Статус дружбы с пользователем. 
        /// </summary>
        public const string FriendStatus = "friend_status";

        /// <summary>
        /// true, если текущий пользователь установил фотографию для профиля.
        /// </summary>
        public const string HasPhoto = "has_photo";

        /// <summary>
        /// Информация о том, есть ли пользователь в закладках у текущего пользователя.
        /// </summary>
        public const string IsFavorite = "is_favorite";

        /// <summary>
        /// Информация о том, является ли пользователем другом текущего пользователя. 
        /// </summary>
        public const string IsFriend = "is_friend";

        /// <summary>
        /// Информация о том, скрыт ли пользователь из ленты новостей текущего пользователя.
        /// </summary>
        public const string IsHiddenFromFeed = "is_hidden_from_feed";

        /// <summary>
        /// Девичья фамилия.
        /// </summary>
        public const string MaidenName = "maiden_name";

        /// <summary>
        /// Информация о военной службе пользователя. 
        /// </summary>
        public const string Military = "military";

        /// <summary>
        /// Строковый идентификатор главной фотографии профиля пользователя в формате {user_id}_{photo_id}, например, 6492_192164258. В некоторых случаях (если фотография была установлена очень давно) это поле не возвращается.
        /// </summary>
        public const string PhotoId = "photo_id";

        /// <summary>
        /// Имя пользователя в заданном падеже. 
        /// </summary>
        /// <param name="nameCase">Падеж</param>
        public static string FirstNameInCase(UserNameCase nameCase) => "first_name_" + nameCase.Value;

        /// <summary>
        /// Фамилия пользователя в заданном падеже.
        /// </summary>
        /// <param name="nameCase">Падеж</param>
        public static string LastNameInCase(UserNameCase nameCase) => "last_name_" + nameCase.Value;
    }
}